//导入 express
const express = require('express')
//创建web服务器
const app = express();
const moment = require('moment');

//启动服务器
app.listen(8080, () => {
	console.log('8080 端口服务器已启动 http://127.0.0.1:8080')
})
//不使用app.use()定义的中间件，叫做局部生效的中间件,
const mw = function(req, res, next) {
	console.log("调用了mw局部中间件")
	const time = moment().format('YYYY-MM-DD HH:mm:ss');
	req.startTime = time
	next()
}
const mw1 = function(req, res, next) {
	console.log("调用了mw1局部中间件")
	req.mw1 = "光哥"
	next()
}
//全局中间件
app.use((req, res, next) => {
	console.log("调用了全局中间件")
	next()
})

// mw 这个中间件只在"当前路由中生效"，这种用法属于"局部生效的中间件"
app.get('/', [mw, mw1], function(req, res) {
	res.send("URL:" + req.url + " 访问时间：" + req.startTime + req.mw1)
})
// mw这个中间件不会影响下面这个路由↓↓↓
app.post('/', function(req, res) {
	res.send("URL:" + req.url + " 访问时间：" + req.startTime)
})

//中间件的分类
//1 应用级别的中间件 通过app.use()或 app.get()或 app.post()，绑定到app实例上的中间件，叫做应用级别的中间件
//2 路由级别的中间件 绑定到express.Router()实例上的中间件，叫做路由级别的中间件。
//3 错误级别的中间件 错误级别中间件的作用:专门用来捕获整个项目中发生的异常错误，从而防止项目异常崩溃的问题。
//格式:错误级别中间件的function处理函数中，必须有4个形参，形参顺序从前到后，分别是(err, req, res, next)。

app.get('/cw', (req, res) => { //路由
	throw new Error('🐏吃太胖了') //抛出一个自定义错误
	res.send("你好")
})

app.use((err, req, res, next) => { //错误级别的中间件
	console.log('发生错误' + err.message) //在服务器内部打印错误信息
	res.send("错误信息:" + err.message) //向客户端返回的内容
})
//注意:错误级别的中间件,必须注册在所有路由之后!

//4 Express内置的中间件
//express.static 快速托管静态资源的内置中间件，例如: HTML文件、图片、CSS样式等（无兼容性)
//express.json解析JSON格式的请求体数据（有兼容性，仅在4.16.0+版本中可用)
//express.urlencoded解析URL-encoded格式的请求体数据（有兼容性，仅在4.16.0+版本中可用)
//配置解析application/json格式数据的内置中间件

//配置解析application/x-www-form-urlencoded格式数据的内置中间件
app.use(express.urlencoded({
	extended: false
}))
